/* 
 * File:   structures.h
 * Author: nuno
 *
 * Created on February 1, 2012, 7:46 PM
 */

#ifndef STRUCTURES_H
#define	STRUCTURES_H

#ifdef	__cplusplus
extern "C" {
#endif

#define NAME_MAX_SIZE 100
#define PASS_MAX_SIZE 15
#define USER_MAX_SIZE 15

    /*
     * typedefs para a avaliação
     */
    typedef enum {
        CONT, FINAL, APPEAL
    } MODALITY;

    typedef enum {
        APPROVED, DISAPPROVED, IN_COURSE,
        // aprovado, reprovado, em curso
    } STATE;

    typedef struct {
        float grade_test;
        float grade_work;
        float grade_test_rec;
        float grade_work_rec;
        MODALITY mod;
        STATE state;
    } EVALUATION;

    /*
     * typedefs para os utilizadores: cada utilizador que seja aluno vai ter um 
     * apontador para a sua avaliacao; caso o utilizador nao seja aluno a 
     * variavel 'eval' fica a NULL.
     */
    typedef enum {
        NULL_USER, STUDENT, PROF, REG_PROF
    } TYPE_USER;

    typedef struct {
        char name[NAME_MAX_SIZE];
        char username[USER_MAX_SIZE];
        char password[PASS_MAX_SIZE];
        int mec_number;
        TYPE_USER type;
        // apontador para EVALUATION para poder ser nullable
        EVALUATION * eval;
    } USER;

    /*
     * Users linked list
     */
    typedef struct st_user_node {
        USER * user; // nullable
        struct st_user_node * next;
    } listNode;

    listNode * add_user_sort_mec(USER *, listNode*);
    listNode * add_user_sort_name(USER *, listNode*);
    void delete_user(int, listNode*);
    USER * check_user(char * username, listNode*);
    USER * check_user_mec(int mec_number, listNode * list);

    listNode * convertMec2Name(listNode*);
    listNode * convertName2Mec(listNode*);

    void free_list(listNode*);
    int get_list_size(listNode * list);

#ifdef	__cplusplus
}
#endif

#endif	/* STRUCTURES_H */

